<!DOCTYPE html>
<html lang=en>
<head>
    <!-- so meta -->
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="HandheldFriendly" content="True">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
    <meta name="description" content="架构系列：ASP.NET 项目结构搭建我们头开始，从简单的单项目解决方案，逐步添加业务逻辑的约束，从应用逻辑和领域逻辑两方面考虑，从简单的单个项目逐步搭建一个多项目的解决方案。主要内容： （1）搭建应用逻辑和领域逻辑都简单的单项目 （2）为应用逻辑复杂的单项目添加应用服务 （3）为领域逻辑复杂的单项目添加领域行为 （4）Application膨胀时，分离Application项目 （5）分离Inf">
<meta property="og:type" content="article">
<meta property="og:title" content="架构系列：ASP.NET项目结构搭建">
<meta property="og:url" content="http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/index.html">
<meta property="og:site_name" content="TmoonSite">
<meta property="og:description" content="架构系列：ASP.NET 项目结构搭建我们头开始，从简单的单项目解决方案，逐步添加业务逻辑的约束，从应用逻辑和领域逻辑两方面考虑，从简单的单个项目逐步搭建一个多项目的解决方案。主要内容： （1）搭建应用逻辑和领域逻辑都简单的单项目 （2）为应用逻辑复杂的单项目添加应用服务 （3）为领域逻辑复杂的单项目添加领域行为 （4）Application膨胀时，分离Application项目 （5）分离Inf">
<meta property="og:locale" content="en_US">
<meta property="article:published_time" content="2017-02-14T16:22:56.000Z">
<meta property="article:modified_time" content="2020-01-07T10:48:14.861Z">
<meta property="article:author" content="Tmoonlight">
<meta name="twitter:card" content="summary">
    
    
        
          
              <link rel="shortcut icon" href="/images/favicon.ico">
          
        
        
          
            <link rel="icon" type="image/png" href="/images/logo2.gif" sizes="192x192">
          
        
        
          
            <link rel="apple-touch-icon" sizes="180x180" href="/images/logo2.gif">
          
        
    
    <!-- title -->
    <title>架构系列：ASP.NET项目结构搭建</title>
    <!-- styles -->
    
<link rel="stylesheet" href="/css/style.css">

    <!-- persian styles -->
    
      
<link rel="stylesheet" href="/css/rtl.css">

    
    <!-- rss -->
    
    
<meta name="generator" content="Hexo 4.2.0"></head>

<body class="max-width mx-auto px3 ltr">
    
      <div id="header-post">
  <a id="menu-icon" href="#"><i class="fas fa-bars fa-lg"></i></a>
  <a id="menu-icon-tablet" href="#"><i class="fas fa-bars fa-lg"></i></a>
  <a id="top-icon-tablet" href="#" onclick="$('html, body').animate({ scrollTop: 0 }, 'fast');" style="display:none;"><i class="fas fa-chevron-up fa-lg"></i></a>
  <span id="menu">
    <span id="nav">
      <ul>
         
          <li><a href="/">Home</a></li>
         
          <li><a href="/about/">About</a></li>
         
          <li><a href="/archives/">Writing</a></li>
         
          <li><a href="/projects_url">Projects</a></li>
        
      </ul>
    </span>
    <br/>
    <span id="actions">
      <ul>
        
        <li><a class="icon" href="/2017/02/15/%E5%85%B3%E4%BA%8E%E6%88%BF%E9%97%B4%E7%9A%84%E6%95%B4%E7%90%86%E4%B8%8E%E6%94%B6%E7%BA%B3%EF%BC%8C%E6%9C%89%E4%BB%80%E4%B9%88%E5%A5%BD%E7%9A%84%E5%BB%BA%E8%AE%AE%EF%BC%9F-%E7%9F%A5%E4%B9%8E/"><i class="fas fa-chevron-left" aria-hidden="true" onmouseover="$('#i-prev').toggle();" onmouseout="$('#i-prev').toggle();"></i></a></li>
        
        
        <li><a class="icon" href="/2017/02/03/ASP.NET%E4%B8%AD%E5%85%B3%E4%BA%8EAsync%E5%92%8CAwait%E7%9A%84%E6%A6%82%E8%BF%B0/"><i class="fas fa-chevron-right" aria-hidden="true" onmouseover="$('#i-next').toggle();" onmouseout="$('#i-next').toggle();"></i></a></li>
        
        <li><a class="icon" href="#" onclick="$('html, body').animate({ scrollTop: 0 }, 'fast');"><i class="fas fa-chevron-up" aria-hidden="true" onmouseover="$('#i-top').toggle();" onmouseout="$('#i-top').toggle();"></i></a></li>
        <li><a class="icon" href="#"><i class="fas fa-share-alt" aria-hidden="true" onmouseover="$('#i-share').toggle();" onmouseout="$('#i-share').toggle();" onclick="$('#share').toggle();return false;"></i></a></li>
      </ul>
      <span id="i-prev" class="info" style="display:none;">Previous post</span>
      <span id="i-next" class="info" style="display:none;">Next post</span>
      <span id="i-top" class="info" style="display:none;">Back to top</span>
      <span id="i-share" class="info" style="display:none;">Share post</span>
    </span>
    <br/>
    <div id="share" style="display: none">
      <ul>
  <li><a class="icon" href="http://www.facebook.com/sharer.php?u=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/" target="_blank" rel="noopener"><i class="fab fa-facebook " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://twitter.com/share?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&text=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-twitter " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.linkedin.com/shareArticle?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&title=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-linkedin " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://pinterest.com/pin/create/bookmarklet/?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&is_video=false&description=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-pinterest " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="mailto:?subject=架构系列：ASP.NET项目结构搭建&body=Check out this article: http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/"><i class="fas fa-envelope " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://getpocket.com/save?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&title=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-get-pocket " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://reddit.com/submit?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&title=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-reddit " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.stumbleupon.com/submit?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&title=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-stumbleupon " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://digg.com/submit?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&title=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-digg " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.tumblr.com/share/link?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&name=架构系列：ASP.NET项目结构搭建&description=" target="_blank" rel="noopener"><i class="fab fa-tumblr " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://news.ycombinator.com/submitlink?u=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&t=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-hacker-news " aria-hidden="true"></i></a></li>
</ul>

    </div>
    <div id="toc">
      <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#架构系列：ASP-NET-项目结构搭建"><span class="toc-number">1.</span> <span class="toc-text">架构系列：ASP.NET 项目结构搭建</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1-搭建应用逻辑和领域逻辑都简单的单项目"><span class="toc-number">1.0.1.</span> <span class="toc-text">1.搭建应用逻辑和领域逻辑都简单的单项目</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2-为应用逻辑复杂的单项目添加应用服务"><span class="toc-number">1.0.2.</span> <span class="toc-text">2.为应用逻辑复杂的单项目添加应用服务</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3-为领域逻辑复杂的单项目添加领域行为"><span class="toc-number">1.0.3.</span> <span class="toc-text">3.为领域逻辑复杂的单项目添加领域行为</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4-Application膨胀时，分离Application项目"><span class="toc-number">1.0.4.</span> <span class="toc-text">4.Application膨胀时，分离Application项目</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-分离Infrastructure项目"><span class="toc-number">1.0.5.</span> <span class="toc-text">5.分离Infrastructure项目</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6-添加Web服务支持"><span class="toc-number">1.0.6.</span> <span class="toc-text">6.添加Web服务支持</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7-Web服务器负载均衡的支持"><span class="toc-number">1.0.7.</span> <span class="toc-text">7.Web服务器负载均衡的支持</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#8-其他方面的扩展支持"><span class="toc-number">1.0.8.</span> <span class="toc-text">8.其他方面的扩展支持</span></a></li></ol></li></ol></li></ol>
    </div>
  </span>
</div>

    
    <div class="content index py4">
        
        <article class="post" itemscope itemtype="http://schema.org/BlogPosting">
  <header>
    
    <h1 class="posttitle" itemprop="name headline">
        架构系列：ASP.NET项目结构搭建
    </h1>



    <div class="meta">
      <span class="author" itemprop="author" itemscope itemtype="http://schema.org/Person">
        <span itemprop="name">TmoonSite</span>
      </span>
      
    <div class="postdate">
      
        <time datetime="2017-02-14T16:22:56.000Z" itemprop="datePublished">2017-02-15</time>
        
      
    </div>


      

      

    </div>
  </header>
  

  <div class="content" itemprop="articleBody">
    <h1 id="架构系列：ASP-NET-项目结构搭建"><a href="#架构系列：ASP-NET-项目结构搭建" class="headerlink" title="架构系列：ASP.NET 项目结构搭建"></a><a href="http://www.cnblogs.com/easygame/p/5150949.html" target="_blank" rel="noopener">架构系列：ASP.NET 项目结构搭建</a></h1><p>我们头开始，从简单的单项目解决方案，逐步添加业务逻辑的约束，从应用逻辑和领域逻辑两方面考虑，从简单的单个项目逐步搭建一个多项目的解决方案。主要内容：</p>
<p>（1）搭建应用逻辑和领域逻辑都简单的单项目</p>
<p>（2）为应用逻辑复杂的单项目添加应用服务</p>
<p>（3）为领域逻辑复杂的单项目添加领域行为</p>
<p>（4）Application膨胀时，分离Application项目</p>
<p>（5）分离Infrastructure项目</p>
<p>（6）添加Web服务支持</p>
<p>（7）Web服务器负载均衡的支持</p>
<p>（8）其他方面的扩展支持</p>
<h3 id="1-搭建应用逻辑和领域逻辑都简单的单项目"><a href="#1-搭建应用逻辑和领域逻辑都简单的单项目" class="headerlink" title="1.搭建应用逻辑和领域逻辑都简单的单项目"></a>1.搭建应用逻辑和领域逻辑都简单的单项目</h3><p>业务逻辑简单，主要的用例和CURD几乎一一对应，没有区分应用逻辑和领域逻辑的必要。</p>
<p>（1）搭建单项目解决方案：Example，项目类型为<a href="http://asp.net/" target="_blank" rel="noopener">ASP.NET</a> MVC</p>
<p>（2）添加Application文件夹，添加IRepository<T>接口。</p>
<p>（3）在Application文件夹中添加Domain文件夹，使用POCO作为实体。</p>
<p>（3）添加Infrastructure文件夹，添加Dependency文件夹，添加IContainer和IoCContainer实现，添加Repository文件夹和EfRepository<T>实现。</p>
<p>（4）添加Web文件夹，添加IoCControllerFactory实现，在Controller中通过构造注入IRespository<T>。</p>
<h3 id="2-为应用逻辑复杂的单项目添加应用服务"><a href="#2-为应用逻辑复杂的单项目添加应用服务" class="headerlink" title="2.为应用逻辑复杂的单项目添加应用服务"></a>2.为应用逻辑复杂的单项目添加应用服务</h3><p>业务逻辑复杂的原因更多体现在流程控制上而非领域逻辑上，因此我们对上文的项目进行改造。</p>
<p>（1）Application文件夹中添加Service文件夹，通过ApplicationService接口来抽象应用逻辑，在实现ApplicationService接口时通过构造注入IRepository<T>。</p>
<p>（2）在Controller不在直接依赖IRepository，在Controller中通过构造注入IApplicationService。</p>
<h3 id="3-为领域逻辑复杂的单项目添加领域行为"><a href="#3-为领域逻辑复杂的单项目添加领域行为" class="headerlink" title="3.为领域逻辑复杂的单项目添加领域行为"></a>3.为领域逻辑复杂的单项目添加领域行为</h3><p>领域逻辑复杂表现在过多的直接通过属性进行实体状态判断并多次赋值，一般情况下这些代码可以通过重构添加到实体。</p>
<p>（1）从ApplicationService中分离出与流程控制无关的代码。</p>
<p>（2）对实体类添加行为，实体类的public方法的定义分离到实体接口中，其他方法为私有方法。</p>
<p>此时的项目结构如图所示：</p>
<h3 id="4-Application膨胀时，分离Application项目"><a href="#4-Application膨胀时，分离Application项目" class="headerlink" title="4.Application膨胀时，分离Application项目"></a>4.Application膨胀时，分离Application项目</h3><p>Application是项目的核心，本身都是业务逻辑相关的代码，即使对其他类库有依赖也可以通过接口隔离方式消除，因此在Application代码膨胀时，无论是应用逻辑和领域逻辑哪种原因，都应该分离Application项目，更重要的意义在于我们需要对Application项目进行单元测试。事实上复杂一些的项目，我们一开始构建的就是Application项目及其单元测试。</p>
<p>（1）在解决方案中添加Example.Application项目。</p>
<p>（2）将Example项目中的Application文件夹下的全部文件迁移到Example.Application项目中，这样无需修改命名空间。</p>
<p>（3）修改Example项目添加Example.Application项目的引用。</p>
<p>此时解决方案的结构如图所示：</p>
<h3 id="5-分离Infrastructure项目"><a href="#5-分离Infrastructure项目" class="headerlink" title="5.分离Infrastructure项目"></a>5.分离Infrastructure项目</h3><p>分离Application项目后，由于Infrastructure只单向依赖Application中的接口，因此分离Infrastructure项目顺理成章。如果是多客户端项目，在分离Infrastructure后可以考虑再从Web项目中分离出单独表现逻辑层Example.WebBase。</p>
<p>（1）在解决方案中添加Example.Infrastructure项目。</p>
<p>（2）将Example项目中的Infrastructure文件夹下的全部文件迁移到Example.Infrastructure项目中，同样无需修改命名空间。</p>
<p>（3）修改项目的引用，添加Example对Example.Infrastructure项目的引用，添加Example.Infrastructure对Example.Application的引用。</p>
<p>此时解决方案结构如图所示：</p>
<h3 id="6-添加Web服务支持"><a href="#6-添加Web服务支持" class="headerlink" title="6.添加Web服务支持"></a>6.添加Web服务支持</h3><p>由于Web项目只依赖ApplicationService的接口，这是应有之意。我们添加服务层时只需要提供Web服务类型的IApplicationService接口实现即可。</p>
<p>（1）添加Example.Application.WebApi项目，引用Example.Application项目，封装ApplicationService应用服务。</p>
<p>（2）添加Example.WebApiApplicationService项目，引用Example.Application和Example.Application.WebApi项目，实现IApplicationService接口的WebApi版本WebApiApplicationService。</p>
<p>（3）修改Example项目的依赖注入配置，将IApplicationService的实现配置为WebApiApplicationService。</p>
<p>（4）还要记得将Web项目中配置的ApplicationService的第三方依赖接口的依赖注入配置转移到Web服务项目中。</p>
<p>此时解决方案如图所示：</p>
<h3 id="7-Web服务器负载均衡的支持"><a href="#7-Web服务器负载均衡的支持" class="headerlink" title="7.Web服务器负载均衡的支持"></a>7.Web服务器负载均衡的支持</h3><p>添加Web服务器的负载均衡主要解决认证token的问题和Session的问题。</p>
<p>（1）<a href="http://asp.net/" target="_blank" rel="noopener">ASP.NET</a>的Forms认证可以通过修改Web.config支持生成同样的用户token。</p>
<p>（2）<a href="http://asp.net/" target="_blank" rel="noopener">ASP.NET</a>的Session可以通过自定义SessionStateStoreProviderBase实现分离Session到Session状态服务器或集群。</p>
<h3 id="8-其他方面的扩展支持"><a href="#8-其他方面的扩展支持" class="headerlink" title="8.其他方面的扩展支持"></a>8.其他方面的扩展支持</h3><p>无论是邮件服务、缓存还是数据库，Application都是通过接口隔离了具体的实现，因此我们可以按需添加ApplicationService中定义的IEmail、ICache、ILogger等的其他实现，再修改依赖注入的配置即可。如果没有采用Web服务，修改Web项目，否则修改Web服务项目的依赖注入配置。</p>
<p>您的推荐，我的动力。</p>

  </div>
</article>



        
          <div id="footer-post-container">
  <div id="footer-post">

    <div id="nav-footer" style="display: none">
      <ul>
         
          <li><a href="/">Home</a></li>
         
          <li><a href="/about/">About</a></li>
         
          <li><a href="/archives/">Writing</a></li>
         
          <li><a href="/projects_url">Projects</a></li>
        
      </ul>
    </div>

    <div id="toc-footer" style="display: none">
      <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#架构系列：ASP-NET-项目结构搭建"><span class="toc-number">1.</span> <span class="toc-text">架构系列：ASP.NET 项目结构搭建</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#1-搭建应用逻辑和领域逻辑都简单的单项目"><span class="toc-number">1.0.1.</span> <span class="toc-text">1.搭建应用逻辑和领域逻辑都简单的单项目</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#2-为应用逻辑复杂的单项目添加应用服务"><span class="toc-number">1.0.2.</span> <span class="toc-text">2.为应用逻辑复杂的单项目添加应用服务</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#3-为领域逻辑复杂的单项目添加领域行为"><span class="toc-number">1.0.3.</span> <span class="toc-text">3.为领域逻辑复杂的单项目添加领域行为</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#4-Application膨胀时，分离Application项目"><span class="toc-number">1.0.4.</span> <span class="toc-text">4.Application膨胀时，分离Application项目</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#5-分离Infrastructure项目"><span class="toc-number">1.0.5.</span> <span class="toc-text">5.分离Infrastructure项目</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#6-添加Web服务支持"><span class="toc-number">1.0.6.</span> <span class="toc-text">6.添加Web服务支持</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#7-Web服务器负载均衡的支持"><span class="toc-number">1.0.7.</span> <span class="toc-text">7.Web服务器负载均衡的支持</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#8-其他方面的扩展支持"><span class="toc-number">1.0.8.</span> <span class="toc-text">8.其他方面的扩展支持</span></a></li></ol></li></ol></li></ol>
    </div>

    <div id="share-footer" style="display: none">
      <ul>
  <li><a class="icon" href="http://www.facebook.com/sharer.php?u=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/" target="_blank" rel="noopener"><i class="fab fa-facebook fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://twitter.com/share?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&text=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-twitter fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.linkedin.com/shareArticle?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&title=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-linkedin fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://pinterest.com/pin/create/bookmarklet/?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&is_video=false&description=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-pinterest fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="mailto:?subject=架构系列：ASP.NET项目结构搭建&body=Check out this article: http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/"><i class="fas fa-envelope fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://getpocket.com/save?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&title=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-get-pocket fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://reddit.com/submit?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&title=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-reddit fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.stumbleupon.com/submit?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&title=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-stumbleupon fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://digg.com/submit?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&title=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-digg fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.tumblr.com/share/link?url=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&name=架构系列：ASP.NET项目结构搭建&description=" target="_blank" rel="noopener"><i class="fab fa-tumblr fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://news.ycombinator.com/submitlink?u=http://yoursite.com/2017/02/15/%E6%9E%B6%E6%9E%84%E7%B3%BB%E5%88%97%EF%BC%9AASP.NET%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84%E6%90%AD%E5%BB%BA/&t=架构系列：ASP.NET项目结构搭建" target="_blank" rel="noopener"><i class="fab fa-hacker-news fa-lg" aria-hidden="true"></i></a></li>
</ul>

    </div>

    <div id="actions-footer">
        <a id="menu" class="icon" href="#" onclick="$('#nav-footer').toggle();return false;"><i class="fas fa-bars fa-lg" aria-hidden="true"></i> Menu</a>
        <a id="toc" class="icon" href="#" onclick="$('#toc-footer').toggle();return false;"><i class="fas fa-list fa-lg" aria-hidden="true"></i> TOC</a>
        <a id="share" class="icon" href="#" onclick="$('#share-footer').toggle();return false;"><i class="fas fa-share-alt fa-lg" aria-hidden="true"></i> Share</a>
        <a id="top" style="display:none" class="icon" href="#" onclick="$('html, body').animate({ scrollTop: 0 }, 'fast');"><i class="fas fa-chevron-up fa-lg" aria-hidden="true"></i> Top</a>
    </div>

  </div>
</div>

        
        <footer id="footer">
  <div class="footer-left">
    Copyright &copy; 2020 Tmoonlight
  </div>
  <div class="footer-right">
    <nav>
      <ul>
         
          <li><a href="/">Home</a></li>
         
          <li><a href="/about/">About</a></li>
         
          <li><a href="/archives/">Writing</a></li>
         
          <li><a href="/projects_url">Projects</a></li>
        
      </ul>
    </nav>
  </div>
</footer>

    </div>
    <!-- styles -->

<link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">


<link rel="stylesheet" href="/lib/justified-gallery/css/justifiedGallery.min.css">


    <!-- jquery -->

<script src="/lib/jquery/jquery.min.js"></script>


<script src="/lib/justified-gallery/js/jquery.justifiedGallery.min.js"></script>

<!-- clipboard -->

  
<script src="/lib/clipboard/clipboard.min.js"></script>

  <script type="text/javascript">
  $(function() {
    // copy-btn HTML
    var btn = "<span class=\"btn-copy tooltipped tooltipped-sw\" aria-label=\"Copy to clipboard!\">";
    btn += '<i class="far fa-clone"></i>';
    btn += '</span>'; 
    // mount it!
    $(".highlight table").before(btn);
    var clip = new ClipboardJS('.btn-copy', {
      text: function(trigger) {
        return Array.from(trigger.nextElementSibling.querySelectorAll('.code')).reduce((str,it)=>str+it.innerText+'\n','')
      }
    });
    clip.on('success', function(e) {
      e.trigger.setAttribute('aria-label', "Copied!");
      e.clearSelection();
    })
  })
  </script>


<script src="/js/main.js"></script>

<!-- search -->

<!-- Google Analytics -->

<!-- Baidu Analytics -->

<!-- Disqus Comments -->


</body>
</html>
